package com.atguigu.srb.core.controller.api;


import com.atguigu.srb.base.response.R;
import com.atguigu.srb.base.util.JwtUtils;
import com.atguigu.srb.core.pojo.entity.UserInfo;
import com.atguigu.srb.core.pojo.entity.vo.LoginVO;
import com.atguigu.srb.core.pojo.entity.vo.RegisterVO;
import com.atguigu.srb.core.pojo.entity.vo.UserInfoIndexVO;
import com.atguigu.srb.core.service.UserInfoService;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

/**
 * <p>
 * 用户基本信息 前端控制器
 * </p>
 *
 * @author Atguigu
 * @since 2023-05-26
 */
@RestController
@RequestMapping("/api/core/userInfo")
//@CrossOrigin
public class ApiUserInfoController {
    @Resource
    UserInfoService userInfoService;
    @ApiOperation("会员绑定手机号和userType")
    @PutMapping("auth/userInfo/{mobile}/{userType}")
    public R updateUserInfo(@RequestHeader("token")String token,
                           @PathVariable("mobile")String mobile,
                            @PathVariable("userType")Integer userType){
        UserInfo userInfo = userInfoService.updateUserInfo(token, mobile, userType);
        return R.ok().data("item",userInfo);
    }
    @ApiOperation("查询用户中心首页数据")
    @GetMapping("auth/indexData")
    public R getIndexData(@RequestHeader("token")String token){
        UserInfoIndexVO userInfoIndexVO = userInfoService.getUserInfoIndexVO(token);
        return R.ok().data("item",userInfoIndexVO);
    }
    @ApiOperation("校验手机号是否重复注册")
    @GetMapping("isRegisted/{mobile}")
    public R isRegisted(@PathVariable("mobile")String mobile){
//        try {
//            Thread.sleep(3000);
//        } catch (InterruptedException e) {
//            throw new RuntimeException(e);
//        }
        int count = userInfoService.count(Wrappers.lambdaQuery(UserInfo.class)
                .eq(UserInfo::getMobile, mobile));
        //返回true表示手机号可以使用 否则被占用
        return R.ok().data("flag",count==0);
    }

    //当前接口只有用户登录后才可以访问  auth表示需要鉴权的路径
    @ApiOperation("获取用户信息")
    @GetMapping("auth/userDetail")
    public R getUserDetail(@RequestHeader(value = "token" ,required = false )
                               String token){//token代表了用户的登录状态，如果没有或者token解析错误都代表用户未登录或者登录状态失效
        //使用请求头携带token
        Long userId = JwtUtils.getUserId(token);
        //上一行执行成功代表 token未过期、没有被篡改的可用的token
        //脱敏：将敏感的数据置空响应
        UserInfo userInfo = userInfoService.getOne(Wrappers.lambdaQuery(UserInfo.class)
                .eq(UserInfo::getId , userId)
                .select(UserInfo::getId,
                        UserInfo::getUserType,
                        UserInfo::getHeadImg,
                        UserInfo::getNickName));

        return R.ok().data("item",userInfo);
    }

    @ApiOperation("登录")
    @PostMapping("login")
    public R login(@RequestBody LoginVO loginVO,
                   HttpServletRequest request){
        //登录：后端缓存数据，需要将数据绑定的key响应给前端
        //     前端缓存数据，需要将数据转为token交给前端保存
        String token = userInfoService.login(loginVO,request);
        return R.ok().data("token",token);
    }


    @ApiOperation("注册请求")
    @PostMapping("register")
    public R register(@RequestBody RegisterVO registerVO){
        userInfoService.saveUser(registerVO);
        return R.ok().msg("注册成功");
    }


}

